package com.ideaaedi.springcloud.jd.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ideaaedi.springcloud.jd.commonds.entity.PageInfo;
import com.ideaaedi.springcloud.jd.commonds.entity.user.po.SysUserPO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.PhoneUpdateReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysUserAddReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysUserBindDeptPostReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysUserBindRolesReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysUserListReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysUserUpdateReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysQueryUserRoleRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysUserDetailRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysUserListRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.UserDeptPostInfoRespVO;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

import java.util.List;

/**
 * <p>
 * 系统-用户表  (内部员工表) 服务类
 * </p>
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 2021.0.1.A
 */
public interface SysUserService extends IService<SysUserPO> {
    
    /**
     * 列表
     *
     * @param req 参数
     *
     * @return 用户列表
     */
    PageInfo<SysUserListRespVO> list(SysUserListReqVO req);
    
    /**
     * 详情
     *
     * @param userId 用户id
     *
     * @return 用户详情
     */
    SysUserDetailRespVO detail(Long userId);
    
    /**
     * 更新
     *
     * @param req 参数
     *
     * @return 更新后的用户详情
     */
    SysUserDetailRespVO update(SysUserUpdateReqVO req);
    
    /**
     * 新增
     *
     * @param req 参数
     *
     * @return 新增后的用户详情
     */
    SysUserDetailRespVO add(SysUserAddReqVO req);
    
    /**
     * 删除
     *
     * @param userId 用户id
     * @param fromAkSkDelete 是否是来自aksk管理界面的删除
     *
     * @return 删除了的用户详情
     */
    SysUserDetailRespVO delete(Long userId, boolean fromAkSkDelete);
    
    /**
     * 给用户绑定角色
     *
     * @param req 请求模型
     *
     * @return 操作是否成功
     */
    List<SysQueryUserRoleRespVO> bindRole(SysUserBindRolesReqVO req);
    
    /**
     * 查询用户拥有的角色
     *
     * @param userId 用户id
     *
     * @return 角色集合
     */
    List<SysQueryUserRoleRespVO> queryRole(Long userId);
    
    /**
     * 给用户绑定部门和职位
     *
     * @param req
     *         请求模型
     *
     * @return 用户绑定的部门和拥有的角色
     */
    List<UserDeptPostInfoRespVO> bindDeptPost(SysUserBindDeptPostReqVO req);
    
    /**
     * 查询用户绑定的部门和职位
     *
     * @param userId 用户id
     *
     * @return 用户绑定的部门和拥有的角色
     */
    List<UserDeptPostInfoRespVO> queryDeptPost(Long userId);
    
    /**
     * 修改用户手机号
     *
     * @param req 请求参数
     *
     * @return 用户详情
     */
    SysUserDetailRespVO updatePhone(PhoneUpdateReqVO req);
    
    /**
     * 全局判断账号是否存在，并返回账号数据
     *
     * @param accountNo 账号
     * @param excludedId 查询时是否排除指定的id
     *
     * @return  用户信息对象（null-账号不存在）
     */
    @Nullable
    SysUserPO ifAccountExist(@NonNull String accountNo, @Nullable Long excludedId);

}
